package com.hdbandit.multi_tenant;

import java.util.Map;

import javax.sql.DataSource;

import org.hibernate.engine.jdbc.connections.spi.AbstractDataSourceBasedMultiTenantConnectionProviderImpl;
/**
 * 基于多租户数据源的连接提供者实现
 * @author Administrator
 *
 */
public class DataSourceBasedMultiTenantConnectionProviderImpl extends AbstractDataSourceBasedMultiTenantConnectionProviderImpl {

    private static final long serialVersionUID = 1L;

    //默认租户的唯一标识
    private String defaultTenant;

    //各租户id对应的数据源的map集合
    private Map<String, DataSource> map;

    /**
     * 重写父类的构造方法,强制齐要求传入我们的默认租户id标识,和各租户id对应数据源的map集合
     * @param defaultTenant
     * @param map
     */
    public DataSourceBasedMultiTenantConnectionProviderImpl(String defaultTenant, Map<String, DataSource> map) {
        super();
        this.defaultTenant = defaultTenant;
        this.map = map;
    }

    
    /**
     * Allows access to the database metadata of the underlying database(s)
     *  in situations where we do not have a tenant id 
     * (like startup processing, for example).
     * 在我们没有租户ID的情况下（例如启动处理），允许访问底层数据库的数据库元数据。
     */
    @Override
    protected DataSource selectAnyDataSource() {
     return map.get(defaultTenant);
    }

    /**
     * 这个是父类没有实现的抽象方法,必须由子类自己实现
     * 也就是根据租户id的标识,来查询数据源
     */
    @Override
    protected DataSource selectDataSource(String tenantIdentifier) {
     return map.get(tenantIdentifier);
    }

    /**
     * 自定义方法,获取默认的数据源
     * @return
     */
    public DataSource getDefaultDataSource() {
        return map.get(defaultTenant);
    }

    
}
